//////////////////////////////////////////////////////////////////////////////////
// 本程序只供学习使用，未经作者许可，不得用于其它任何用途
// 测试硬件：单片机STM32F103ZET6,正点原子ELITE STM32开发板,主频72MHZ，晶振12MHZ
// QDtech-TFT液晶驱动 for STM32 FSMC
// xiao冯@ShenZhen QDtech co.,LTD
// 公司网站:www.qdtft.com
// 淘宝网站：http://qdtech.taobao.com
// wiki技术网站：http://www.lcdwiki.com
// 我司提供技术支持，任何技术问题欢迎随时交流学习
// 固话(传真) :+86 0755-23594567
// 手机:15989313508（冯工）
// 邮箱:lcdwiki01@gmail.com    support@lcdwiki.com    goodtft@163.com
// 技术支持QQ:3002773612  3002778157
// 技术交流QQ群:324828016
// 创建日期:2018/08/09
// 版本：V1.0
// 版权所有，盗版必究。
// Copyright(C) 深圳市全动电子技术有限公司 2018-2028
// All rights reserved
/****************************************************************************************************
//此模块可以直接插入正点原子ELITE STM32开发板TFTLCD插槽，无需手动接线
//STM32连接引脚是指TFTLCD插槽引脚内部连接的STM32引脚
//=========================================电源接线================================================//
//     LCD模块             TFTLCD插槽引脚        STM32连接引脚
//      VDD       --->         5V/3.3              DC5V/3.3V          //电源
//      GND       --->          GND                  GND              //电源地
//=======================================液晶屏数据线接线==========================================//
//本模块默认数据总线类型为16位并口总线
//     LCD模块             TFTLCD插槽引脚        STM32连接引脚
//      DB0       --->          D0                   PD14        -|
//      DB1       --->          D1                   PD15         |
//      DB2       --->          D2                   PD0          |
//      DB3       --->          D3                   PD1          |
//      DB4       --->          D4                   PE7          |
//      DB5       --->          D5                   PE8          |
//      DB6       --->          D6                   PE9          |
//      DB7       --->          D7                   PE10         |
//如果使用8位模式，则下面的数据线没有使用                         |===>液晶屏16位并口数据信号
//      DB8       --->          D8                   PE11         |
//      DB9       --->          D9                   PE12         |
//      DB10      --->          D10                  PE13         |
//      DB11      --->          D11                  PE14         |
//      DB12      --->          D12                  PE15         |
//      DB13      --->          D13                  PD8          |
//      DB14      --->          D14                  PD9          |
//      DB15      --->          D15                  PD10        -|
//=======================================液晶屏控制线接线==========================================//
//     LCD模块 				     TFTLCD插槽引脚        STM32连接引脚
//       WR       --->          WR                   PD5             //液晶屏写数据控制信号
//       RD       --->          RD                   PD4             //液晶屏读数据控制信号
//       RS       --->          RS                   PG0             //液晶屏数据/命令控制信号
//       RST      --->          RST                复位引脚          //液晶屏复位控制信号
//       CS       --->          CS                   PG12            //液晶屏片选控制信号
//       BL       --->          BL                   PB0             //液晶屏背光控制信号
//=========================================触摸屏触接线=========================================//
//如果模块不带触摸功能或者带有触摸功能，但是不需要触摸功能，则不需要进行触摸屏接线
//	   LCD模块             TFTLCD插槽引脚        STM32连接引脚
//      PEN       --->          PEN                  PF10            //触摸屏触摸中断信号
//      MISO      --->          MISO                 PB2             //触摸屏SPI总线读信号
//      MOSI      --->          MOSI                 PF9             //触摸屏SPI总线写信号
//      T_CS      --->          TCS                  PF11            //触摸屏片选控制信号
//      CLK       --->          CLK                  PB1             //触摸屏SPI总线时钟信号
**************************************************************************************************/
/* @attention
 *
 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
 * TIME. AS A RESULT, QD electronic SHALL NOT BE HELD LIABLE FOR ANY
 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
 **************************************************************************************************/
#ifndef __TOUCH_H__
#define __TOUCH_H__
#include "main.h"

#define TP_PRES_DOWN 0x80 // 触屏被按下
#define TP_CATH_PRES 0x40 // 有按键按下了
#define TOUCH_SIZE_WIDE     (320)
#define TOUCH_SIZE_HIGH     (480)

#define TOUCH_LEFT_X        (3852)
#define TOUCH_RIGHT_X       (189)
#define TOUCH_TOP_Y         (236)
#define TOUCH_BOTTOM_Y      (3948)

// 触摸屏控制器
typedef struct
{
    uint8_t (*init)(void);    // 初始化触摸屏控制器
    uint8_t (*scan)(uint8_t); // 扫描触摸屏.0,屏幕扫描;1,物理坐标;
    void (*adjust)(void);     // 触摸屏校准
    uint16_t x0;              // 原始坐标(第一次按下时的坐标)
    uint16_t y0;
    uint16_t x; // 当前坐标(此次扫描时,触屏的坐标)
    uint16_t y;
    uint8_t sta; // 笔的状态
                 // b7:按下1/松开0;
                 // b6:0,没有按键按下;1,有按键按下.
    ////////////////////////触摸屏校准参数/////////////////////////
    float xfac;
    float yfac;
    short xoff;
    short yoff;
    // 新增的参数,当触摸屏的左右上下完全颠倒时需要用到.
    // touchtype=0的时候,适合左右为X坐标,上下为Y坐标的TP.
    // touchtype=1的时候,适合左右为Y坐标,上下为X坐标的TP.
    uint8_t touchtype;
} _m_tp_dev;

extern _m_tp_dev tp_dev; // 触屏控制器在touch.c里面定义

// 与触摸屏芯片连接引脚
// 与触摸屏芯片连接引脚
#define TOUCH_IRQ()              HAL_GPIO_ReadPin(TOUCH_IRQ_GPIO_Port, TOUCH_IRQ_Pin)
#define TOUCH_DO()               HAL_GPIO_ReadPin(TOUCH_DO_GPIO_Port, TOUCH_DO_Pin)
#define TOUCH_DIN(n)             HAL_GPIO_WritePin(TOUCH_DIN_GPIO_Port, TOUCH_DIN_Pin, (n) ? (GPIO_PIN_SET) : (GPIO_PIN_RESET))
#define TOUCH_CS(n)              HAL_GPIO_WritePin(TOUCH_CS_GPIO_Port, TOUCH_CS_Pin, (n) ? (GPIO_PIN_SET) : (GPIO_PIN_RESET))
#define TOUCH_CLK(n)             HAL_GPIO_WritePin(TOUCH_CLK_GPIO_Port, TOUCH_CLK_Pin, (n) ? (GPIO_PIN_SET) : (GPIO_PIN_RESET))

void TP_Write_Byte(uint8_t num);                                                                                                             // 向控制芯片写入一个数据
uint16_t TP_Read_AD(uint8_t CMD);                                                                                                            // 读取AD转换值
uint16_t TP_Read_XOY(uint8_t xy);                                                                                                            // 带滤波的坐标读取(X/Y)
uint8_t TP_Read_XY(uint16_t *x, uint16_t *y);                                                                                                // 双方向读取(X+Y)
uint8_t TP_Read_XY2(uint16_t *x, uint16_t *y);                                                                                               // 带加强滤波的双方向坐标读取
void TP_Drow_Touch_Point(uint16_t x, uint16_t y, uint16_t color);                                                                            // 画一个坐标校准点
void TP_Draw_Big_Point(uint16_t x, uint16_t y, uint16_t color);                                                                              // 画一个大点
uint8_t TP_Scan(uint8_t tp);                                                                                                                 // 扫描
void TP_Save_Adjdata(void);                                                                                                                  // 保存校准参数
uint8_t TP_Get_Adjdata(void);                                                                                                                // 读取校准参数
void TP_Adjust(void);                                                                                                                        // 触摸屏校准
uint8_t TP_Init(void);                                                                                                                       // 初始化
void TP_Adj_Info_Show(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, uint16_t fac); // 显示校准信息
uint8_t Touch_MyGetPosition(uint16_t *posX, uint16_t *posY);


#endif
